// #pragma once

// #include <vector>
// #include <iostream>

// #include "Structs.h"
// #include "Utils.h"
// #include "LidarConfigurationOptions.h"

// #include <rs_driver/api/lidar_driver.hpp>
// #include <rs_driver/msg/pcl_point_cloud_msg.hpp>
// #include <pcl/point_types.h>
// #include <pcl/visualization/pcl_visualizer.h>
// #include <Poco/Thread.h>

// using namespace robosense::lidar;

// typedef PointCloudT<PointXYZI> PointCloudMsg;

// class LidarDriverX
// {
// public:
//     LidarDriverX(LidarConfigurationOptions *options = new LidarConfigurationOptions(), int id = 0);
//     ~LidarDriverX();

//     void start();
//     void stop();

//     /// @brief 添加回调--数据接收
//     /// @param callback
//     bool addPointCloudMsgCallback(PointCloudDataCallback callback);

// private:
//     int _lidar_id;

//     LidarConfigurationOptions *_options;
//     std::vector<PointCloudDataCallback> _pointCloudDataCallback;

//     RSDriverParam _rsDriverParam;
//     void updateDriverParam(LidarConfigurationOptions *_options);

//     LidarDecodeType _decodeType;
//     bool is_noDelay = false;
//     int max_buffer_num = 8;
//     float sample_voxel_size = 0.01f;

//     void exceptionCallback(const Error &code);
//     std::shared_ptr<PointCloudMsg> pointCloudGetCallback();
//     void pointCloudPutCallback(std::shared_ptr<PointCloudMsg> pointCloudMsg);
//     SyncQueue<std::shared_ptr<PointCloudMsg>> _free_cloud_queue;
//     SyncQueue<std::shared_ptr<PointCloudMsg>> _stuffed_cloud_queue;
//     LidarDriver<PointCloudMsg> _driver;

//     bool _to_exit_process;
//     Poco::Thread _threadPointCloudProcess;
//     static void threadPointCloudProcess(void *pContext);
//     void processPointCloud();

//     bool _is_pcd_file = false;
//     std::string _pcd_file_path = "";
//     Poco::Thread _threadPcdFileProcess;
//     static void threadPcdFileProcess(void *pContext);
//     void processPcdFile();
// };